#!/usr/bin/env python3
"""
AI对话系统主程序入口

可通过命令行参数和配置文件定制行为
"""

import os
import sys
import json
import logging
from datetime import datetime
from typing import Dict, Any, Optional

# 确保 src 目录在 Python 路径中
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

from src.core.config_manager import ConfigManager
from src.core.chat_app import ChatApp

def setup_logging(log_dir: str = "logs") -> None:
    """
    设置日志
    
    Args:
        log_dir: 日志文件目录
    """
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
        
    log_file = os.path.join(log_dir, f"chat_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log")
    
    # 添加文件处理器
    file_handler = logging.FileHandler(log_file, encoding='utf-8')
    file_handler.setFormatter(logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    ))
    logging.getLogger().addHandler(file_handler)

def conversation_callback(data: Dict[str, Any]) -> None:
    """
    对话回调函数，保存对话记录
    
    Args:
        data: 对话数据
    """
    history_dir = "history"
    if not os.path.exists(history_dir):
        os.makedirs(history_dir)
        
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    history_file = os.path.join(history_dir, f"conversation_{timestamp}.json")
    
    # 添加时间戳
    data["timestamp"] = timestamp
    
    with open(history_file, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

def print_version() -> None:
    """打印版本信息"""
    from src import __version__, __author__
    print(f"AI对话系统 v{__version__}")
    print("基于 Ollama + Whisper + pyttsx3")
    print(f"作者: {__author__}")
    print("许可证: MIT")

def print_help() -> None:
    """打印帮助信息"""
    print("用法: python main.py [选项]")
    print("\n选项:")
    print("  --help                 显示此帮助信息")
    print("  --version              显示版本信息")
    print("  --debug                启用调试模式")
    print("  --config <文件>        指定配置文件路径")
    print("  --file <文件>          指定要处理的音频文件路径")
    print("  --ai-model <模型>      设置AI模型名称")
    print("  --stt-model <模型>     设置语音识别模型大小 (tiny/base/small/medium/large)")
    print("  --record-time <秒>     设置录音时长")
    print("  --no-history          不保存对话历史")
    print("\n示例:")
    print("  python main.py --debug --ai-model llama3:8b")
    print("  python main.py --file test.wav --stt-model tiny")
    print("  python main.py --config config/custom.json")

def main() -> None:
    """主程序入口"""
    # 检查帮助和版本参数
    if "--help" in sys.argv or "-h" in sys.argv:
        print_help()
        return
        
    if "--version" in sys.argv or "-v" in sys.argv:
        print_version()
        return
    
    try:
        # 初始化配置，优先使用 config 目录中的默认配置
        default_config = "config/default.json"
        if os.path.exists(default_config):
            config_manager = ConfigManager(default_config)
        else:
            config_manager = ConfigManager()
            
        config_manager.load_config()
        
        # 设置日志
        setup_logging()
        
        # 创建并运行聊天应用
        app = ChatApp(config_manager)
        
        # 是否保存历史记录
        callback = None
        if "--no-history" not in sys.argv:
            callback = conversation_callback
        
        # 获取音频文件路径
        audio_file = config_manager.get_input_file()
        
        # 运行对话
        app.run_conversation(audio_file=audio_file, callback=callback)
    
    except KeyboardInterrupt:
        print("\n程序已退出")
    except Exception as e:
        logging.error(f"程序运行失败: {e}")
        import traceback
        logging.error(traceback.format_exc())
        sys.exit(1)

if __name__ == "__main__":
    main() 